Software applications, such as virtual machines (VMs), may be executed by a group, or “cluster,” of host computing devices. Each VM creates an abstraction of physical computing resources, such as a processor and memory, of the host executing the VM and executes a “guest” operating system, which, in turn, executes one or more software applications. The abstracted resources may be functionally indistinguishable from the underlying physical resources to the guest operating system and software applications.
A system, such as a datacenter, may include a plurality of VMs or other applications or objects. During operation of the system, the objects may experience performance degradation. For example, one or more objects may become non-functional if the object or a host that the object is executing on becomes unresponsive or “locked up.” In addition, objects may experience performance degradation if resources used by the objects are constrained. Such performance degradation may cause the system to operate unsatisfactorily and/or may require maintenance to be performed to correct the performance degradation. Moreover, objects within the system may be at least partially dependent on one another such that an action implemented on one object may affect a performance of one or more other objects.
Due to the complexity of such systems, the causes of such performance degradation may be difficult to determine. Some systems include agents that enable the automatic correction, or “self-healing,” of certain object performance degradation issues. However, such systems may only address the performance degradation of an individual object, rather than determining one or more actions to maximize a performance of the system as a whole. In addition, such systems or agents may not be able to determine which actions actually improve the performance of the objects or system, and which actions have no effect or have a negative effect on the system performance.